package com.kizuki.thread;

import org.junit.Test;

import java.util.concurrent.TimeUnit;

public class Lock8 {

    private Phone phone = new Phone();

    @Test
    public void test() throws InterruptedException {

        new Thread(()->{
            phone.doing2();
        }, "A").start();

        // 保证上面线程先拿到锁 这里不好写例子意会一下
        TimeUnit.SECONDS.sleep(1);

        new Thread(()->{
            phone.doing2();
        }, "B").start();
    }

}

/**
 * 锁住的是什么
 * 线程先拿到锁先执行，执行完了释放锁
 */
class Phone{

    // 普通方法
    // 无锁
    public void doing1(){
        System.out.print(Thread.currentThread().getName() + " ");
        System.out.println("Im doing1");
    }

    // synchronized方法
    // 锁的是new出来的Phone对象
    public synchronized void doing2() {
        System.out.print(Thread.currentThread().getName() + " ");
        System.out.println("Im doing2");
    }

    // static synchronized方法
    // 锁的是Phone.class
    public static synchronized void doing3(){
        System.out.print(Thread.currentThread().getName() + " ");
        System.out.println("Im doing3");
    }

}